package com.ydyyt.realize;

import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;

import com.ydyyt.main.MyMenu;
import com.ydyyt.pojo.User;

public class Realize {
	//存放用户消费详情
	List<String> list = new ArrayList<String>();
	//根据手机号存放用户信息
	Map<String,User> map = new HashMap<String,User>();
	//用于存放某个手机号消费的金额
	Map<String,Double> map2 = new HashMap<String,Double>();
	//实例化Random对象，实现随机数的产生
	Random random = new Random();
	//实例化Scanner对象，实现数据的输入
	Scanner input = new Scanner(System.in);
	//菜单对象
	MyMenu menu = new MyMenu();
	//用户注册
	public void register(){
		User user = new User();
		//选择手机号
		System.out.println("******************备选手机号码*******************");
		String[] phoneNums = getPhoneNum(9);
		for(int i = 0; i < 9; i++) {
			System.out.print((i + 1) + "、" + phoneNums[i] + "\t\t");
			if((i + 1) % 3 == 0) {
				System.out.println();
			}
		}
		//判断手机号是否已经存在在
		boolean flag3 = true;
		//初始化手机号
		String str = null;
		//跟踪比较的次数
		int count = 0;
		do{
		System.out.println("请输入卡号(输入1~9的序号)：");
		Set<Entry<String,User>> entrys = map.entrySet();
		str = phoneNums[input.nextInt() - 1];//得到手机号
		for(Entry<String,User> entry : entrys) {
			if(str.equals(entry.getKey())) {//比较手机号，如果存在退出for循环
				break;
			}else {
				count++;
			}
		}
		  if(count == map.size()) {
			flag3 = false;
		  }
		}while(flag3);
		//将新的手机号封装到一个user对象中
		user.setPhone(str);
		
		//选择套餐类型
		System.out.println("1.话唠套餐 2.网虫套餐 3.超人套餐，请选择套餐(输入序号)：");
		int num = input.nextInt();
		//初始化套餐的名字
		String myPackage = null;
		switch(num) {
		case 1:
			myPackage = "话唠套餐";
			break;
		case 2:
			myPackage = "网虫套餐";
			break;
		case 3:
			myPackage = "超人套餐";
			break;
		default:
			System.out.println("输入非法！");
			break;
		}
		//将选中的套餐的序号封装到一个user对象中
		user.setMyPackage(num);
		//接收用户名
		boolean flag = true;
		String name = null;
		while(flag) {
			System.out.println("请输入用户名：");
			name = input.next();
			if(name.length() > 4 ||name.length() <= 1) {
				System.out.println("输入的用户名不符合规定，请重新输入。");
				System.out.println();
			}else {
				flag = false;
			}
		}
		//将用户名封装到一个user对象中
		user.setName(name);
		//输入密码
		boolean flag2 = true;
		//初始化密码
		String password = null;
		do {
			System.out.println("请输入密码：");
			password = input.next();
			if (password.length() != 6) {//规定密码为6位
				System.out.println("密码必须为6位，请重新输入密码");
			}else {
				System.out.println("请再次确认密码：");
				String password2 = input.next();
			   if(password.equals(password2)) {
				   flag2 = false;
			   }else {
				   System.out.println("两次输入的密码不一致，请重新输入！");
				}
			}	
		}while(flag2);
		//将密码封装到一个user对象中
		user.setPassword(password);
		
		//输入预存金额
		//初始化预存金额(话费)
		double calls = 0;
		boolean flag4 =true;
		do{
			System.out.println("请输入预存话费金额(单位:元)：");
		    calls = input.nextDouble();
		    //话唠套餐
		    switch(num) {
			case 1:
				if(calls < 58) {
					System.out.println("您预存的话费不足以支持本月固定套餐资费58元，请重新充值");
				}else {
					//将扣除本月固定费后剩余话费封装到一个user对象中
					user.setCalls(calls - 58);
					user.setFlow(0);
					user.setFreeCallTime(500);
					user.setFreeSedMessage(30);
					user.setRates(58);
					flag4 = false;
				}
				break;
			case 2:
				if(calls < 68) {
					System.out.println("您预存的话费不足以支持本月固定套餐资费68元，请重新充值");
				}else {
					//将扣除本月固定费后剩余话费封装到一个user对象中
					user.setCalls(calls - 68);
					user.setFlow(3000);
					user.setFreeCallTime(0);
					user.setFreeSedMessage(0);
					user.setRates(68);
					flag4 = false;
				}
				break;
			case 3:
				if(calls < 78) {
					System.out.println("您预存的话费不足以支持本月固定套餐资费78元，请重新充值");
				}else {
					//将扣除本月固定费后剩余话费封装到一个user对象中
					user.setCalls(calls - 78);
					user.setFlow(1000);
					user.setFreeCallTime(200);
					user.setFreeSedMessage(50);
					user.setRates(78);
					flag4 = false;
				}
				break;
		    }
		}while(flag4);
		System.out.println("恭喜你注册成功！");
		//将对象的hashcode作为ID
		user.setId(String.valueOf(user.hashCode()));
		//将该用户存入map集合
		map.put(str, user);
		
	}
	
	//随机生成手机号
	public String[] getPhoneNum(int i) {
		//利用数组存放随机生成的手机号
		String[] phoneNums = new String[i];
	   //初始化随机生成的数字
	   int num = 0;
	   //初始化生成的11位手机号
	   String phone = null;
	   //用于拼接生成的每个数字
	   StringBuilder str = new StringBuilder();
	   for(int j = 0; j < i; j++) {
		   for(int k = 1; k <= 8; k++) {
			   num = random.nextInt(10);
			   str.append(String.valueOf(num));
		   }
		phone = "139" + str;
		phoneNums[j] = phone;
		str.delete(0, 10);
		}
	   return phoneNums;
	}
	//测试存在的客户
//	public void show() {
//		Set<Entry<String,User>> entrys = map.entrySet();
//		for(Entry<String,User> entry : entrys) {
//			System.out.println(entry.getValue().toString());
//		}
//	}
	//话费充值
	public void addCredit() {
		System.out.println("请输入充值的手机号：");
		String phoneNum = input.next();
		//跟踪比较手机号
		int i = 0;
		Set<Entry<String,User>> entrys = map.entrySet();
		//查找系统中是否有该手机号存在
		for(Entry<String,User> entry : entrys) {
			if(phoneNum.equals(entry.getKey())) {
				break;
			}else {
				i++;
			}
		}
		if(i == map.size()){
			System.out.println("此手机号尚未注册，请前往主页进行注册。");
			return;
		}
		//System.out.println(map.get(phoneNum).toString());
		System.out.println("请输入充值金额：");
		double money = input.nextDouble();
		User user = map.get(phoneNum);
		user.setCalls(money + user.getCalls()); 
		map.replace(phoneNum, user);
//		String name = map.get(phoneNum).getName();     
//		String phone = map.get(phoneNum).getPhone();   
//		String password = map.get(phoneNum).getPassword();
//		int myPackage = map.get(phoneNum).getMyPackage();
//		double calls = money + map.get(phoneNum).getCalls();//话费 
//		user.setName(name);
//		user.setPhone(phone);
//		user.setPassword(password);
//		user.setMyPackage(myPackage);
//		user.setCalls(calls);
//		map.replace(phone, user);
		System.out.println("充值成功,当前话费余额为" + map.get(phoneNum).getCalls());
	}
	//用户登录
	public void login() throws CallException, IOException {
		System.out.println("请输入您的手机号：");
		String phoneNum = input.next();
		//跟踪比较手机号
		int i = 0;
		Set<Entry<String,User>> entrys = map.entrySet();
		//查找系统中是否有该手机号存在
		for(Entry<String,User> entry : entrys) {
			if(phoneNum.equals(entry.getKey())) {
				break;
			}else {
				i++;
			}
		}
		if(i == map.size()){
			System.out.println("此手机号尚未注册，请前往主页进行注册。");
			return;
		}
		boolean flag = true;
		while(flag) {
		    System.out.println("请输入您的密码：");
		    String password = input.next();
		    //判断密码是否正确
		    if(password.equals(map.get(phoneNum).getPassword())) {
		    	MyMenu myMenu = new MyMenu();
		    	myMenu.subMenu(phoneNum);
		    	flag = false;
		    }else {
		    	System.out.println("对不起，您输入的密码不正确，请重新输入您的密码。");
		    }
		}
	}
	//本月账单查询
	public void billQuery(String phoneNum) {
		System.out.println("**************本月账单*************");
		System.out.println("你的卡号：" + phoneNum);
		switch (map.get(phoneNum).getMyPackage()) {
		case 1:
			System.out.println("套餐资费：" + 58 + "元");
			System.out.println("合计：" + map2.get(phoneNum)+ 58);
			System.out.println("账户余额：" + map.get(phoneNum).getCalls());
			break;
		case 2:
			System.out.println("套餐资费：" + 68 + "元");
			System.out.println("合计：" + map2.get(phoneNum) + 68);
			System.out.println("账户余额：" + map.get(phoneNum).getCalls());
			break;
		case 3:
			System.out.println("套餐资费：" + 78 + "元");
			System.out.println("合计：" + map2.get(phoneNum)+ 78);
			System.out.println("账户余额：" + map.get(phoneNum).getCalls());
			break;
		default:
			break;
		}
		
		
	}
	//套餐余量查询
	public void balanceOfQuery(String phoneNum) {
		System.out.println("免费通话时长剩余：" + map.get(phoneNum).getFreeCallTime() + "分钟");
		System.out.println("免费上网流量剩余：" + map.get(phoneNum).getFlow() + "MB");
		System.out.println("免费短信条数剩余：" + map.get(phoneNum).getFreeSendMessage() + "条");
		System.out.println("本月固定资费：" + map.get(phoneNum).getRates() + "元/月");
		
	}
	//打印消费详单
	public void printConsumeList(String phoneNum) throws IOException {
		FileWriter fWriter = new FileWriter("消费账单\\conlist.txt");
		for(int i = 0; i < list.size(); i++) {
			fWriter.write(list.get(i) + "\n");
			
		}
		  fWriter.flush();//刷新缓冲区
		  fWriter.close();//字符输出流关闭
		  System.out.println("打印成功，请前往   /便民移动营业厅/消费账单/conlist.txt 查看");
	}
	//套餐变更
	public void packageChange(String phoneNum) throws CallException, IOException {
		System.out.println("**********套餐变更***********");
		System.out.println("1.话唠套餐  2.网虫套餐  3.超人套餐 ,请选择(序号):");
		int num = input.nextInt();
		if(num == map.get(phoneNum).getMyPackage()) {
			System.out.println("对不起，您已经是该套餐客户，无需更换套餐。");
		}else{
			switch(num) {
			case 1:
				if(map.get(phoneNum).getCalls() < 58) {
					System.out.println("对不起，您的话费余额不足以支付新套餐本月资费，请充值后再办理更换套餐业务。");
				}else {
					User user = map.get(phoneNum);
					user.setCalls(user.getCalls() - 58);
					map2.put(phoneNum, map2.get(phoneNum) + 58);
					user.setMyPackage(1);
					user.setRates(58);
					user.setFreeCallTime(500 + user.getFreeCallTime());
					user.setFreeSedMessage(30 + user.getFreeSendMessage());
					System.out.println("恭喜您，更换套餐成功！");
					System.out.println("话唠套餐：免费通话时长为500分钟/月，免费短信条数为30条/月，固定资费为58元/月");
				}
				break;
			case 2:
				if(map.get(phoneNum).getCalls() < 68) {
					System.out.println("对不起，您的话费余额不足以支付新套餐本月资费，请充值后再办理更换套餐业务。");
				}else {
					User user = map.get(phoneNum);
					user.setCalls(user.getCalls() - 68);
					map2.put(phoneNum, map2.get(phoneNum) + 68);
					user.setMyPackage(2);
					user.setRates(68);
					user.setFlow(user.getFlow() + 3000);
					System.out.println("恭喜您，更换套餐成功！");
					System.out.println("网虫套餐：免费上网流量为3GB/月，固定资费为68元/月");
				}
				break;
			case 3:
				if(map.get(phoneNum).getCalls() < 78) {
					System.out.println("对不起，您的话费余额不足以支付新套餐本月资费，请充值后再办理更换套餐业务。");
				}else {
					User user = map.get(phoneNum);
					user.setCalls(user.getCalls() - 78);
					map2.put(phoneNum, map2.get(phoneNum) + 78);
					user.setMyPackage(3);
					user.setRates(78);
					user.setFlow(user.getFlow() + 1000);
					user.setFreeCallTime(200 + user.getFreeCallTime());
					user.setFreeSedMessage(50 + user.getFreeSendMessage());
					System.out.println("恭喜您，更换套餐成功！");
					System.out.println("超人套餐：免费通话时长为200分钟/月，免费上网流量为1GB/月，免费短信条数为50条/月，固定资费为78元/月");
				}
				break;
			}
			menu.subMenu(phoneNum);
		}
		
	}
	//办理退网
	public void handleOutNet(String phoneNum) {
		//删除该用户
		map.remove(phoneNum);
		System.out.println("**********办理退网***********");
		System.out.println("手机号为" + phoneNum + "的用户办理退网成功！");
		System.out.println("感谢您的使用！");
	}
	//使用便民
	public void search() throws CallException, IOException {
		System.out.println("请输入您的手机号：");
		String phoneNum = input.next();
		//跟踪比较手机号
		int i = 0;
		Set<Entry<String,User>> entrys = map.entrySet();
		//查找系统中是否有该手机号存在
		for(Entry<String,User> entry : entrys) {
			if(phoneNum.equals(entry.getKey())) {
				break;
			}else {
				i++;
			}
		}
		if(i == map.size()){
			System.out.println("此手机号尚未注册，请前往主页进行注册。");
			return;
		}
		boolean flag = true;
		while(flag) {
		    System.out.println("请输入您的密码：");
		    String password = input.next();
		    //判断密码是否正确
		    if(password.equals(map.get(phoneNum).getPassword())) {
		    	//调用场景
		    	scene(phoneNum);
		    	MyMenu myMenu = new MyMenu();
		    	myMenu.mainMenu();
		    	flag = false;
		    }else {
		    	System.out.println("对不起，您输入的密码不正确，请重新输入您的密码。");
		    }
		}
		
		
	}
	//场景模拟
	public void scene(String phoneNum) throws CallException {
		int num = random.nextInt(7);
		int num2 = map.get(phoneNum).getMyPackage();
		//初始化剩余免费流量
		double flow = 0;
		//初始化剩余免费短信条数
		int sms = 0;
		//初始化剩余免费通话分钟数
		int call = 0;
		User user = map.get(phoneNum);
		if(num2 == 1) {
			switch (num % 5) {
			case 0:
				if(user.getCalls() < 0) {
					throw new CallException("您的手机余额不足，不能上网了，请充值后再使用。");
				}else {
				System.out.println("一不留神，看电视剧用了1GB流量。");
				list.add(getCurrentTime() + "\t" + "手机号:" + phoneNum +",看电视剧用了1GB流量");
				flow = user.getFlow() - 1000;
				if(flow < 0) {
					user.setCalls(user.getCalls() - (0.1 * (Math.abs(flow))));
					map2.put(phoneNum, map2.get(phoneNum) + Math.abs(flow));
					user.setFlow(0);
				}else {
					user.setFlow(flow);
				}
				}
				break;
			case 1:
				if(user.getCalls() < 0) {
					throw new CallException("您的手机余额不足，不能QQ视频聊天了，请充值后再使用。");
				}else {
					System.out.println("和女朋友QQ视频聊天2个小时，用了500MB流量。");
					list.add(getCurrentTime() + "\t" + "手机号:" + phoneNum +",和女朋友QQ视频聊天用了500MB流量");
				flow = user.getFlow() - 500;
				if(flow < 0) {
					user.setCalls(user.getCalls() - (0.1 * (Math.abs(flow))));
					map2.put(phoneNum, map2.get(phoneNum) + Math.abs(flow));
					user.setFlow(0);
				}else {
					user.setFlow(flow);
				}
				}
				break;
			case 2:
				if(user.getCalls() < 0) {
					throw new CallException("您的手机余额不足，不能玩网络游戏了，请充值后再使用。");
				}else {
				System.out.println("玩游戏用了200MB流量。");
				list.add(getCurrentTime() + "\t" + "手机号:" + phoneNum +",玩游戏用了200MB流量");
				flow = user.getFlow() - 200;
				if(flow < 0) {
					user.setCalls(user.getCalls() - (0.1 * (Math.abs(flow))));
					map2.put(phoneNum, map2.get(phoneNum) + Math.abs(flow));
					user.setFlow(0);
				}else {
					user.setFlow(flow);
				}
				}
				break;
			case 3:
				if(user.getCalls() < 0) {
					throw new CallException("您的手机余额不足，不能和女朋友打电话了，请充值后再使用。");
				}else {
				System.out.println("打电话给女朋友用了半个小时");
				list.add(getCurrentTime() + "\t" + "手机号:" + phoneNum +",给女朋友打电话用了30分钟");
				call = user.getFreeCallTime() - 30;
				if(call < 0) {
					user.setCalls(user.getCalls() - (0.2 * (Math.abs(call))));
					map2.put(phoneNum, map2.get(phoneNum) + Math.abs(call));
					user.setFreeCallTime(0);;
				}else {
					user.setFreeCallTime(call);
				}
				}
				break;
			case 4:
				if(user.getCalls() < 0) {
					throw new CallException("您的手机余额不足，不能发短信了，请充值后再使用。");
				}else {
				System.out.println("发了10条短信");
				list.add(getCurrentTime() + "\t" + "手机号:" + phoneNum +",发了10条短信");
				sms = user.getFreeSendMessage() - 10;
				if(sms < 0) {
					user.setCalls(user.getCalls() - (0.1 * (Math.abs(sms))));
					map2.put(phoneNum, map2.get(phoneNum) + Math.abs(sms));
					user.setFreeSedMessage(0);
				}else {
					user.setFreeSedMessage(sms);
				}
				}
				break;
			}
		}else {
			switch(num) {
			case 0:
				if(user.getCalls() < 0) {
					throw new CallException("您的手机余额不足，不能和客户打电话了，请充值后再使用。");
				}else {
				System.out.println("问候客户，谁知其如此难缠，本地通话90分钟");
				list.add(getCurrentTime() + "\t" + "手机号:" + phoneNum +",打电话和客户谈生意用了90分钟");
				call = user.getFreeCallTime() - 90;
				if(call < 0) {
					user.setCalls(user.getCalls() - (0.2 * (Math.abs(call))));
					map2.put(phoneNum, map2.get(phoneNum) + Math.abs(call));
					user.setFreeCallTime(0);;
				}else {
					user.setFreeCallTime(call);
				}
				}
				break;
			case 1:
				System.out.println("和10086客服聊天1个小时，不要话费，贼爽。");
				list.add(getCurrentTime() + "\t" + "手机号:" + phoneNum +",和10086客服免费聊天1个小时");
				break;
			case 2:
				if(user.getCalls() < 0) {
					throw new CallException("您的手机余额不足，不能玩游戏了，请充值后再使用。");
				}else {
				System.out.println("玩游戏用了100MB流量。");
				list.add(getCurrentTime() + "\t" + "手机号:" + phoneNum +",玩游戏用了100MB流量");
				flow = user.getFlow() - 100;
				if(flow < 0) {
					user.setCalls(user.getCalls() - (0.1 * (Math.abs(flow))));
					map2.put(phoneNum, map2.get(phoneNum) + Math.abs(flow));
					user.setFlow(0);
				}else {
					user.setFlow(flow);
				}
				}
				break;
			case 3:
				if(user.getCalls() < 0) {
					throw new CallException("您的手机余额不足，不能上网查资料了，请充值后再使用。");
				}else {
				System.out.println("上网查资料用了200MB流量");
				list.add(getCurrentTime() + "\t" + "手机号:" + phoneNum +",上网查资料用了200MB流量");
				flow = user.getFlow() - 200;
				if(flow < 0) {
					user.setCalls(user.getCalls() - (0.1 * (Math.abs(flow))));
					map2.put(phoneNum, map2.get(phoneNum) + Math.abs(flow));
					user.setFlow(0);
				}else {
					user.setFlow(flow);
				}
				}
				break;
			case 4:
				if(user.getCalls() < 0) {
					throw new CallException("您的手机余额不足，不能给家人打电话了，请充值后再使用。");
				}else {
				System.out.println("打电话给家人用了30分钟。");
				list.add(getCurrentTime() + "\t" + "手机号:" + phoneNum +",给家人打电话用了30分钟");
				call = user.getFreeCallTime() - 30;
				if(call < 0) {
					user.setCalls(user.getCalls() - (0.2 * (Math.abs(call))));
					map2.put(phoneNum, map2.get(phoneNum) + Math.abs(call));
					user.setFreeCallTime(0);;
				}else {
					user.setFreeCallTime(call);
				}
				}
				break;
			case 5:
				if(user.getCalls() < 0) {
					throw new CallException("您的手机余额不足，不能发短信了，请充值后再使用。");
				}else {
				System.out.println("总共发了20条短信,有的发给家人，有的发给女朋友，有的发给朋友");
				list.add(getCurrentTime() + "\t" + "手机号:" + phoneNum +",发了20条短信");
				sms = user.getFreeSendMessage() - 20;
				if(sms < 0) {
					user.setCalls(user.getCalls() - (0.1 * (Math.abs(sms))));
					map2.put(phoneNum, map2.get(phoneNum) + Math.abs(sms));
					user.setFreeSedMessage(0);
				}else {
					user.setFreeSedMessage(sms);
				}
				}
				break;
			}
		}
		
	}
	
	//资费说明
	//一个汉字两个字节，一个\t制表符八个字节
	public void tariffDescription() {
		System.out.println("***********************************************");
		System.out.println("*\t\t   * 话唠套餐   * 网虫套餐  * 超人套餐   *");
		System.out.println("***********************************************");
		System.out.println("* 免费通话时长(分钟) * 500  *  0  * 200  *");
		System.out.println("***********************************************");
		System.out.println("* 免费上网流量（GB）   *  0   *  3  *  1   *");
		System.out.println("***********************************************");
		System.out.println("* 免费短信条数（条）    *  30  *  0  *  50  *");
		System.out.println("***********************************************");
		System.out.println("* 资费(元/月) \t*  58  *  68  *  78  *");
		System.out.println("***********************************************");
	}
	
	//获取时间
	public String getCurrentTime() {
		Calendar calendar = Calendar.getInstance();
		SimpleDateFormat sdf = new SimpleDateFormat("y年m月d日  HH:mm:ss");
		
		return sdf.format(calendar.getTime());
	}
}
